perm filename MIX2[MIX,SYS]1 blob sn#196031 filedate 1976-01-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00013 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002		SUBTTL	MIXMLD - Load MLD file created by the assembler
C00008 00003		SUBTTL	MIXRUN - Records status of machine during execution
C00022 00004	t←←10
C00029 00005	COMMENT  DUMP ROUTINE 
C00032 00006	COMMENT  *RES*   An attempt to increase the utility of the DUMP and
C00040 00007	STROP:	[ASCIZ NOP ]
C00042 00008	STRP05:	[ASCIZ NUM ]
C00046 00009		SUBTTL	MIXERR
C00051 00010		SUBTTL	MIX999
C00054 00011	INIT:	MOVE	P, [IOWD 40, PDL]
C00055 00012	BEGIN NEWS
C00059 00013		XLIST		LITERALS FOLLOW
C00060 ENDMK
C⊗;
	SUBTTL	MIXMLD - Load MLD file created by the assembler

OUTDEC:	IDIVI	10,=10
	HRLM	11,(P)
	SKIPE	10
	PUSHJ	P,OUTDEC
	HLRZ	11,(P)
	ADDI	11,60
	OUTCHR	11
	POPJ	P,

QMLD:	INIT	0, 10			; init in image mode
	SIXBIT	/DSK/
	MLDBLK
	JRST	ZDISK			; error return
	PUSHJ	P,RESCN			;*RES* LOOK FOR NAME ON PREV LINE
	PUSHJ	P,FINFI2		;*RES* LOOK IT UP
	JRST	.+3			;*RES*
	OUTSTR	[ASCIZ  ⊗MIX-LOAD FILE: ⊗]
	PUSHJ	P,FINFO			; get file data
	HRLZI	10, 'MLD'
	MOVEM	10, BLK+1
	MOVE	10, [XWD BLK, MLDBLK+3]	; put data into MLDBLK
	BLT	10, MLDBLK+6
	LOOKUP	0, MLDBLK+3		; lookup file
	JRST	.-7			; error → try again

MBOX:	PUSHJ	P, MLDIN		; get word
	JUMPL	10, MCHAIN		; <0 → chain
	JUMPE	10, MSTART		; 0 → end of file
	MOVEM	10, MLDBOX		; set up box head
	MOVNI	11, 17			; counter
	PUSHJ	P, MLDIN		; get word
	MOVEM	10, MLDBOX+20(11)	; put into box
	AOJL	11, .-2			; back for more
	HLRZ	10, MLDBOX		; set up BLT pointer
	HRRZ	11, MLDBOX
	JUMPE	11, MBOX		; 0 → empty box
	ADD	11, 10
	SOJ	11,
	ADD	10, [XWD  MLDBOX+1, MC0000]
	BLT	10, MC0000 (11)		; move box into core
	JRST	MBOX			; back for more

MCHAIN:	HRRZ	12, 10			; this is the value of the symbol
	TLZ	10, 400000		; mask out "-"
	MOVEI	13, =4000		; want to limit possible number of links in chain

CHAIN1:	HLRZ	11, 10			; get address of MIX word
	CAIL	11, 0			; test for out-of-bounds
	CAILE	11, =3999
	JRST	BADCHN
	SOJL	13, BADCHN		; also test for too many links
	MOVE	10, MC0000 (11)		; get next chain address
	HRLM	12, MC0000 (11)		; put real symbol value into MIX word
	JUMPL	10, MBOX		; "-" → end of chain
	JRST	CHAIN1			; back for more of chain

MSTART:	PUSHJ	P, MLDIN		; get starting address
	ADDI	10, MC0000		; relocate into MIX core
	MOVEM	10, MLDPC0		; save it

	movei	11, symtab		; output first section of symbol table
	movei	12, linked-symtab	; this many entries
mst1:	pushj	p, mldin		; output it
	skipe	10			; if there is an address,
	addi	10, linked-4		; make it real
	movem	10, (11)		; this is the pointer
	sosle	12			; any more words left?
	aoja	11, mst1		; yes

	movei	11, linked		; output second section of symbol table
	movei	12, 600			; this many entries
mst2:	pushj	p, mldin		; output it
	trne	10, 777777		; is there an address in the right half?
	addi	10, linked-4		; yes → make it real
	movem	10, (11)		; get first word of entry
	for x←1,3
{	pushj	p, mldin
	movem	10, (11) x		; get rest of entry
}
	addi	11, 4			; ready for next entry
	sosle	12			; any more?
	jrst	mst2			; yes → get them

	MOVE	PC, MLDPC0		; set PC
	RELEAS	0, 0			; release i/o channel
	JRST	BUTTON	

BADCHN:	OUTSTR	[ASCIZ ⊗
#ERROR: INVALID CHAIN FOR SYMBOL WITH VALUE: ⊗]
	MOVE	10, 12
	PUSHJ	P,OUTDEC
	SETZ	10,
	JRST	MSTART+1

MLDPC0:	0

QPCMLD:	MOVE	PC, MLDPC0		; set PC
	JRST	BUTTON

MLDIN:	SOSG	MLDBLK+2		; decrement character count
	IN	0,			; count exhausted, next buffer
	JRST	.+2			; success
	JRST	ZMLD			; error
	ILDB	10, MLDBLK+1		; get input word
	POPJ	P,			; return

MLDBOX:	BLOCK	20

MLDBLK:	BLOCK	7

symtab:	block	400			; this is the symbol table
linked:	block	600*4
	SUBTTL	MIXRUN - Records status of machine during execution

COMMENT	⊗	MIXRUN is the section which does all the stuff for
		the RUN file.  This file keeps a running record of
		the status of the machine during execution.
	⊗

QRUN:	INIT	1, 0			; init in ASCII mode
	SIXBIT	/DSK/
	XWD	RUNBLK, 0
	JRST	ZDISK
	PUSHJ	P,RESCN			;*RES* SEE IF FILE ON PREV LINE
	PUSHJ	P,FINFI2		;*RES* LOOK IT UP
	JRST	.+3			;*RES*
	OUTSTR	[ASCIZ  ⊗FILE FOR TRACE OUTPUT: ⊗] ; get file name
	PUSHJ	P,FINFO
	MOVE	10, [XWD  BLK, RUNBLK+3]
	BLT	10, RUNBLK+6
	ENTER	1, RUNBLK+3		; ENTER THE FILE
	JRST	.-5			; error → try again
	
	PUSHJ	P, PAGBEG		; initialize the file
	MOVNI	10, =4000		; and zero out MAGIC counters
	HRRZS	MAGIC+=4000(10)
	AOJL	10, .-1
	JRST	QRNC1

QRUNC:	SETZ	10,
	PUSHJ	P,RESCN			;*RES* SEE IF TIMES GIVEN ON PREV LINE
	MOVE	11,RECHAR		;*RES* PICK UP FIRST CHAR
	JRST	QRNC2			;*RES*
QRNC1:	OUTSTR	[ASCII  ⊗MAXIMUM PRINT TIME = ⊗]
	INCHWL	11
	SKIPA
	INCHRW	11
	CAIN	11, 15
	JRST	.+5
QRNC2:	ANDI	11, 17
	IMULI	10, =10
	ADD	10, 11
	JRST	.-6
	MOVEM	10, RUNC
	INCHRW	10
	CAIE	10, 12
	JRST	.-2
	JRST	BUTTON

QRUNX:	RELEAS	1, 0			; close and release channel
	SETZM	RUNC			; zero out RUNC
	JRST	BUTTON			; return to BUTTON mode

RUNBLK:	BLOCK	7

ISPEC:	0				; will hold value of PC before execution of instruction
MSPEC:	0				; will hold value of M
RUNC:	0				; will hold maximum print time
THISC:	0				; will hold count for this instruction
CONTNT:	0				; will hold contents of word addressed by MSPEC
DOTS:	-1				; will hld number of times that some line wasn't outputed
LINENO:	0
SAVEF:	0

MAGIC:	BLOCK	=4000			; will hold the magic diagnostic bits

PUTCHR:	SOSG	RUNBLK+2
	OUT	1,
	JRST	.+2
	JRST	ZDISK
	IDPB	10, RUNBLK+1
	POPJ	P,

OPDEF	PUTDEC	[PUSHJ  P, .]
	ANDI	13, 17
PTDC0:	IDIVI	10, =10
	ADDI	11, 60
	HRLM	11, (P)
	SOSLE	13
	PUSHJ	P, PTDC0
	HLRZ	10, (P)
	JRST	PUTCHR

DEFINE	PUTSTR	(X)
{	PUSH	P, [POINT  7, X]
	PUSHJ	P, PTSTR0
}
PTSTR0:	ILDB	10, -1(P)
	JUMPN	10, .+3
	POP	P, -1(P)
	POPJ	P,
	PUSHJ	P, PUTCHR
	JRST	PTSTR0

OPDEF	BIT1	[1B1]

t←←10
k←←13
z←←12
RUACSV:	BLOCK	17			;SAFE STORAGE FOR AC'S



DORUN:	
	MOVEM	16,RUACSV+16
	MOVEI	16,RUACSV
	BLT	16,RUACSV+15
	MOVE	10, ISPEC		; increase count for this instruction
	MOVE	11, JBUSX		; this is the number of times JBUS * executed
	ADDM	11, MAGIC(10)		; so that should be the updated count
	AOS	MAGIC(10)
	HRRZ	10, MAGIC(10)		; is it too many?
	SUB	10, JBUSX		; but want 10 to be only a single increment
	MOVEM	10, THISC		; save the count
	HRRZ	11, ERRORC		; check if any errors
	JUMPG	11, .+3
	CAMLE	10, RUNC
	JRST	RUNDOT
	AOSG	T, DOTS			; was previous line dots?
	JRST	NODOTS			; no
	MOVEI	13, 6			; output last six digits of number of dots
	PUTDEC
	PUTSTR	<[ASCIZ  ⊗
⊗]>
	SOS	LINENO

NODOTS:	SETOM	DOTS			; reset DOTS to -1
	MOVE	10, MSPEC
	CAIL	10, 0
	CAILE	10, =3999
	SKIPA	10, [0]
	MOVE	10, MC0000(10)
	MOVEM	10, CONTNT
	SOSG	LINENO			; end-of-page?
	PUSHJ	P, PAGEND

	MOVE	10,EXTIME		;*RES* PUT OUT TRACE INFORMATION
	MOVEI	13,6			;   STARTING WITH EXECUTION TIME
	PUTDEC
	MOVEI	10,40
	PUSHJ	P,PUTCHR

	MOVE	10,ISPEC		;NOW DO PROGRAM COUNTER
	MOVEI	13,4
	PUTDEC
	MOVEI	10,40
	PUSHJ	P,PUTCHR

	MOVE	10,THISC		;GET COUNT OF EXECUTIONS FOR THIS LOC
	MOVEI	13,2
	PUTDEC
	MOVEI	10,40
	PUSHJ	P,PUTCHR

	MOVEM	INSTR,VALYOU		;PUT OUT INSTRUCTION WORD
	MOVE	10,IMASK		;  IN PROPER FORMAT
	MOVEM	10,MASK
	PUSHJ	P,VALOUT

	LDB	T+1,[POINT 6,INSTR,29]	;GET FIELD SPECIFICATION
	LDB	K,[POINT 6,INSTR,35]	;AND OP CODE
	PUTSTR	<@STROP(K)>		;PUT OUT OP CODE MNEMONIC
	MOVEI	10,40
	PUSHJ	P,PUTCHR		;AND ANOTHER BLANK

	MOVE	10,MSPEC		;GET EFFECTIVE ADDRESS
	MOVEM	10,VALYOU		;PUT IT OUT
	MOVE	10,IRMASK		; AS A 2 BYTE INTEGER
	MOVEM	10,MASK
	PUSHJ	P,VALOUT

	MOVE	10,BMASK		;THE NEXT 2 OR 3 THINGS WRITTEN BYTEWISE
	MOVEM	10,MASK
	LDB	10,[POINT 6,INSTR,35]	;GET OP CODE
	SKIPE	PRNCNT(10)		;SEE IF CONTENTS IS TO BE PRINTED
	JRST	DOCNTN			;YES
	MOVEI	13,=12			;GET # OF BLANKS DESIRED
	MOVEI	10,40
	PUSHJ	P,PUTCHR
	SOJG	13,.-1			;PUT BLANKS IN OUTPUT LINE
	JRST	NOCNTN
DOCNTN:	MOVE	10,CONTNT		;GET CONTENTS OF EFFECTIVE ADDRESS
	MOVEM	10,VALYOU
	PUSHJ	P,VALOUT		;PRINT CONTENTS

NOCNTN:	MOVEM	RA,VALYOU		;PUT OUT REGISTER A
	PUSHJ	P,VALOUT

	MOVEM	RX,VALYOU
	PUSHJ	P,VALOUT		;PUT OUT REGISTER X

	MOVE	10,IRMASK		;CHANGE MASK FOR INDEX REGISTERS
	MOVEM	10,MASK
	MOVEM	R1,VALYOU
	PUSHJ	P,VALOUT
	MOVEM	R2,VALYOU
	PUSHJ	P,VALOUT
	MOVEM	R3,VALYOU
	PUSHJ	P,VALOUT
	MOVEM	R4,VALYOU
	PUSHJ	P,VALOUT
	MOVEM	R5,VALYOU
	PUSHJ	P,VALOUT
	MOVEM	R6,VALYOU
	PUSHJ	P,VALOUT

	MOVE	10,RJ			;PUT OUT J REGISTER
	MOVEI	13,4
	PUTDEC
	MOVEI	10,40
	PUSHJ	P,PUTCHR


LINEND:	MOVEI	T, 40			; init to space
	MOVE	FLAGS,RUACSV+FLAGS	;PICK UP SAVED FLAG VALUE
	TLNE	FLAGS, OVFLAG		; OVFLAG on?
	MOVEI	T, "X"			; yes
	PUSHJ	P, PUTCHR		; output it
	MOVEI	T,40
	PUSHJ	P,PUTCHR		;PUT OUT A BLANK TO SEPARATE
	TLNE	FLAGS, GFLAG		; is G on?
	MOVEI	T, "G"			; yes
	TLNE	FLAGS, EFLAG		; is E on?
	MOVEI	T, "E"			; yes
	TLNE	FLAGS, LFLAG		; is L on?
	MOVEI	T, "L"			; yes
	PUSHJ	P, PUTCHR		; output it (AT MOST 1 CAN BE ON)

	PUTSTR	<[ASCIZ  ⊗
⊗]>
	MOVSI	16,RUACSV		;RESTORE REGISTERS
	BLT	16,16
	POPJ	P,			; return

RUNDOT:	AOSG	DOTS			; only output if first unprinted line
	PUSHJ	P,	[PUTSTR	<[ASCIZ  ⊗........⊗]>
			POPJ	P,]
	MOVSI	16,RUACSV
	BLT	16,16			;RESTORE REGISTERS
	POPJ	P,

PAGEND:	MOVEI	T, 14			; form-feed
	PUSHJ	P, PUTCHR
PAGBEG:	PUTSTR	TITLE1
	PUTSTR	TITLE2
	MOVEI	T, =45
	MOVEM	T, LINENO
	POPJ	P,

TITLE1:	ASCIZ	⊗
EXTIME _LOC ## ___INSTRUCTION__ __M__ __CONTENTS_ _____rA____ _____rX____⊗
TITLE2:	ASCIZ	⊗ _rI1_ _rI2_ _rI3_ _rI4_ _rI5_ _rI6_ _rJ_ O C

⊗
PRNCNT:			;NON-ZERO MEANS PRINT CONTENTS FOR THIS OP CODE
	0			;  0
	REPEAT	=4,{1}		;  1 -  4
	REPEAT	=3,{0}		;  5 -  7
	REPEAT	=26,{1}		;  8 - 33
	REPEAT	=22,{0}		; 34 - 55
	REPEAT	=8,{1}		; 56 - 63

COMMENT ⊗ DUMP ROUTINE ⊗

ENDRUN:	
	SETZM	DMIN
	MOVEI	10,=3999
	MOVEM	10,DMAX
	MOVE	10,BMASK
	MOVEM	10,DFALTM
DUMP:
	MOVEI	10, 14
	PUSHJ	P, PUTCHR
	PUTSTR	<[ASCIZ ⊗
DUMP OF NON-ZERO LOCATIONS

_LOC       ##          +0      ##          +1      ##          +2      ##          +3      ##          +4

⊗]>
 	PUTSTR	MSKMSG
	PUSHJ	P,PMASK			;PRINT MASK DESCRIPTION
	PUTSTR	<[ASCIZ /

/]>


	MOVE	Z,DMIN			;GET BOTTOM OF DUMP RANGE
NEXTRY:	HRRZ	T, MAGIC(Z)
	SKIPN	T
	SKIPE	MC0000(Z)
	PUSHJ	P, THISET
	AOJ	Z,
	CAMG	Z, DMAX
	JRST	NEXTRY
	MOVEI	10, 14
	PUSHJ	P, PUTCHR
	SETZM	LINENO
	JRST	BUTTON

THISET:	MOVE	T, Z
	IDIVI	T, 5
	IMULI	T, 5
	MOVE	Z, T
	MOVEI	K, 4
	MOVEM	K, ZZ
	PUTDEC
	MOVEI	T, ":"
	PUSHJ	P, PUTCHR
	PUTSTR	<[ASCIZ ⊗  ⊗]>
	PUSHJ	P, ENDRNZ
	SOSL	ZZ
	AOJA	Z, .-2
	PUTSTR	<[ASCIZ ⊗
⊗]>
	POPJ	P,

ZZ:	0
MSKMSG:	ASCIZ	/   BYTE GROUPING FOR NON-EXECUTED LOCATIONS: /


ENDRNZ:	
	HRRZ	T, MAGIC(Z)
	MOVEI	K, 6
	PUTDEC
	MOVEI	T, 40
	PUSHJ	P, PUTCHR
	MOVE	K,MC0000(Z)
	MOVEM	K,VALYOU	;SAVE VALUE FOR VALOUT ROUTINE
	HRRZ	T, MAGIC(Z)
	JUMPE	T, NOTEX
	MOVE	T,IMASK
	MOVEM	T,MASK
	PUSHJ	P,VALOUT	;WRITE WITH BYTES GROUPED AS INSTR
	MOVEI	T," "		;FOLLOWED BY ANOTHER BLANK
	PUSHJ	P,PUTCHR
	POPJ	P,
NOTEX:	MOVE	T,DFALTM	;GET DEFAULT MASK
	MOVEM	T,MASK
	PUSHJ	P,VALOUT
	MOVEI	K,=11		;GET STANDARD SIZE + 1
	SUB	K,PICSIZ	;SUB SIZE OF PRINTED MASKED OUTPUT
	SKIPA	T,[40]		;GET A BLANK
	PUSHJ	P,PUTCHR
	SOJGE	K,.-1		;FILL OUT FIELD WITH BLANKS
	POPJ	P,

COMMENT ⊗ *RES*   An attempt to increase the utility of the DUMP and
TRACE routines by allowing other formats for printing information.
⊗

BEGIN MSPARS

COMMENT ⊗ MSPARS, routine to parse a mask description of the form:
	<mask>::= t | <mask>t
	t::= n | (n)
	n::= 1 | 2 | 3 | 4 | 5
	When MSPARS is called, the first char of the description is
in register 10. Subsequent chars are obtained from the TTY by INCHWL.
On exit, locaton MASK contains the mask and register 13 contains the
total "length" (in bytes) of the masked information.  The mask consists
of 4 bit bytes, each conataining an (visible/invisible) bit and a 3
bit number of bytes.  A zero byte ends the mask.
⊗


↑MSPARS:		;PARSE A MASK DESCRIPTION
	MOVE	13,[POINT 4,MASK]
	MOVEM	13,MSKPTR		;SET UP POINTER TO MASK
	SETZB	13,MASK
	JRST 	MSP1A			;DON'T READ THE FIRST TIME
MSP1:	INCHWL	10			;GET THE NEXT CHAR
	CAIN	10,40			;IGNORE BLANKS
	JRST	.-2
MSP1A:	CAIE	10,"("			;IS THIS GROUP INVISIBLE?
	JRST	MSP3			;NO
	INCHWL	10			;GET NUMBER OF BYTES
	CAIN	10,40
	JRST	.-2			;IGNORE BLANKS
	CAIG	10,"5"			;SHOULD BE A DIGIT BETWEEN 1 AND 5
	CAIGE	10,"1"
	JRST	MSP2			;IT WASN'T
	SUBI	10,"0"-10		;CONVERT TO OCTAL AND ADD BIT 10
	IDPB	10,MSKPTR		;STORE PATTERN
	ADDI	13,-10(10)		;UPDATE SIZE
	INCHWL	10
	CAIN	10,40
	JRST	.-2
	CAIN	10,")"			;LOOK FOR CLOSING )
	JRST	MSP1			;FOUND IT

MSP2:	OUTSTR	[ASCIZ /ILLEGAL MASK DESCRIPTION
/]
	JRST	QBUTN			;READ TO END OF LINE AND GO TO BUTTON

MSP3:	CAIG	10,"5"			;END OF DESCRIPTION OF NOT DIGIT
	CAIGE	10,"1"
	POPJ	P,
	SUBI	10,"0"			;CONVERT TO OCTAL
	ADD	13,10
	IDPB	10,MSKPTR		;STORE DESCRIPTION
	JRST	MSP1			;LOOK SOME MORE

↑MSKPTR: 0
↑MASK:	0
BEND MSPARS

DFALTM:	0		;LOCATION OF THE DEFAULT MASK FOR DUMP
IMASK:	BYTE	(4)2,1,1,1	;INSTRUCTION MASK
BMASK:	BYTE	(4)1,1,1,1,1	;BYTE MASK
DMASK:	BYTE	(4)5		;DECIMAL MASK
IRMASK:	BYTE	(4)13,2		;INDEX REGISTER MASK


BEGIN VALOUT
COMMENT ⊗ Output the value in location VALYOU as specified by the mask
in locaton MASK.
⊗

↑VALOUT:		;OUTPUT (TO TRACE FILE) A VALUE
	PUSH	P,10
	PUSH	P,11
	PUSH	P,12
	PUSH	P,13
	SETZM	PICSIZ			;COLLECT SIZE OF PRINTED OUTPUT
	MOVEI	10,"+"			;GET THE SIGN TO PUT OUT
	SKIPGE	VALYOU
	MOVEI	10,"-"			;CHANGE IF NEGATIVE
	PUSHJ	P,PUTCHR
	MOVE	10,[POINT 4,MASK]
	MOVEM	10,MSKPTR
	MOVE	10,[POINT 6,VALYOU,5]	;SET UP POINTERS
	MOVEM	10,VALPTR#
VAL1:	ILDB	12,MSKPTR		;GET BYTE COUNT
	JUMPE	12,VAL3			;QUIT IF OUT OF BYTES
	TRZN	12,10			;ARE THESE INVISIBLE?
	JRST	VAL2			;NO
	IBP	VALPTR			;MOVE PAST BYTES
	SOJG	12,.-1
	JRST	VAL1			;LOOK AT NEXT FIELD
VAL2:	SETZB	10,13			;INITIALIZE REGISTERS
VAL2A:	ILDB	11,VALPTR		;GET NEXT BYTE
	ADDI	13,2			;INCREASE FIELD SIZE
	LSH	10,6			;COLLECT NUMBER
	ADD	10,11
	SOJG	12,VAL2A		;GET REQUISITE NUMBER OF BYTES
	ADDM	13,PICSIZ
;
;	NOW WRITE OUT NUMBER IN 10 WITH (13) DIGITS
;
	PUTDEC
	JRST	VAL1			;GO TO NEXT FIELD

VAL3:	MOVEI	10,40
	PUSHJ	P,PUTCHR		;PUT BLANK AT END
	POP	P,13
	POP	P,12
	POP	P,11
	POP	P,10
	POPJ	P,

↑VALYOU:	0
↑PICSIZ:	0
BEND VALOUT

BEGIN RANGE
COMMENT ⊗ Routine to obtain the desired dump range from the TTY.  Ranges are
of the form n:n.  The default range is 0:3999.  On exit, the range is in
locations DMIN and DMAX and the next input character is in 10.
Register 11 is modified by this routine.
⊗
↑RANGE:
	MOVEI	11,=3999		;INITIALIZE RANGE
	MOVEM	11,DMAX
	PUSHJ	P,RGNUM			;LOOK FOR A NUMBER
	MOVEM	11,DMIN			;MOVE 0 OR NUMBER TO DMIN
	CAIN	10,":"			;IS A RANGE SPECIFIED
	JRST	RNG1			;YES
	SKIPE	NFOUND			;WAS THERE A NUMBER AT ALL
	MOVEM	11,DMAX			;YES, A SINGLE LOCATION TO DUMP
	POPJ	P,			;NO
RNG1:	PUSHJ	P,RGNUM			;GET UPPER BOUND
	MOVEM	11,DMAX			;STORE IT
	POPJ	P,			;RETURN

RGNUM:
	SETZ	11,
	SETZM	NFOUND#			;NO NUMBER FOUND YET
RG1:	INCHWL	10
	CAIN	10,40
	JRST	.-2			;GET A NON-BLANK CHARACTER
	CAIG	10,"9"
	CAIGE	10,"0"			;IS IT A DIGIT?
	JRST	RG2			;NO
	IMULI	11,=10
	ADDI	11,-"0"(10)		;ACCUMULATE NUMBER
	SETOM	NFOUND
	JRST	RG1
RG2:	CAIL	11,=4000		;IS IT A VALID ADDRESS
	MOVEI	11,=3999		;GIVE TOP OF CORE IF TOO BIG
	SKIPA
	INCHWL	10			;GET NEXT CHAR
	CAIN	10,40			;GET NEXT NON-BLANK CHAR
	JRST	.-2
	POPJ	P,
	JRST	QBUTN

↑DMIN:	0
↑DMAX:	0
BEND RANGE

BEGIN PMASK
COMMENT ⊗ PRINT MASK DESCRIPTION TO TRACE FILE ⊗

↑PMASK:	PUSH	P,10			;SAVE REGISTERS
	PUSH	P,11
	PUSH	P,13
	SETZM	PICSIZ
	MOVE	11,[POINT 4,DFALTM]	;GET MASK
DMP1:	ILDB	13,11			;GET MASK ENTRY
	JUMPE	13,DMP3			;QUIT IF END OF MASK
	TRZN	13,10			;IS IT VISIBLE
	JRST	DMP2			;YES
	MOVEI	10,"("
	PUSHJ	P,PUTCHR
	MOVEI	10,60(13)
	PUSHJ	P,PUTCHR
	MOVEI	10,")"
	PUSHJ	P,PUTCHR
	MOVEI	10,3			;UPDATE SIZE OF PRINTED MASK
	ADDM	10,PICSIZ
	JRST	DMP1
DMP2:	MOVEI	10,60(13)
	PUSHJ	P,PUTCHR
	AOS	PICSIZ
	JRST	DMP1			;LOOK AT NEXT MASK ENTRY
DMP3:	POP	P,13			;RESTORE REGISTERS
	POP	P,11
	POP	P,10
	POPJ	P,
BEND PMASK

STROP:	[ASCIZ ⊗NOP ⊗]
	[ASCIZ ⊗ADD ⊗]
	[ASCIZ ⊗SUB ⊗]
	[ASCIZ ⊗MUL ⊗]
	[ASCIZ ⊗DIV ⊗]
	@STRP05(T+1)
	@STRP06(T+1)
	[ASCIZ ⊗MOVE⊗]

	[ASCIZ ⊗LDA ⊗]
	[ASCIZ ⊗LD1 ⊗]
	[ASCIZ ⊗LD2 ⊗]
	[ASCIZ ⊗LD3 ⊗]
	[ASCIZ ⊗LD4 ⊗]
	[ASCIZ ⊗LD5 ⊗]
	[ASCIZ ⊗LD6 ⊗]
	[ASCIZ ⊗LDX ⊗]

	[ASCIZ ⊗LDAN⊗]
	[ASCIZ ⊗LD1N⊗]
	[ASCIZ ⊗LD2N⊗]
	[ASCIZ ⊗LD3N⊗]
	[ASCIZ ⊗LD4N⊗]
	[ASCIZ ⊗LD5N⊗]
	[ASCIZ ⊗LD6N⊗]
	[ASCIZ ⊗LDXN⊗]

	[ASCIZ ⊗STA ⊗]
	[ASCIZ ⊗ST1 ⊗]
	[ASCIZ ⊗ST2 ⊗]
	[ASCIZ ⊗ST3 ⊗]
	[ASCIZ ⊗ST4 ⊗]
	[ASCIZ ⊗ST5 ⊗]
	[ASCIZ ⊗ST6 ⊗]
	[ASCIZ ⊗STX ⊗]

	[ASCIZ ⊗STJ ⊗]
	[ASCIZ ⊗STZ ⊗]
	[ASCIZ ⊗JBUS⊗]
	[ASCIZ ⊗IOC ⊗]
	[ASCIZ ⊗IN  ⊗]
	[ASCIZ ⊗OUT ⊗]
	[ASCIZ ⊗JRED⊗]
	@STRP39(T+1)

	@STRP40(T+1)
	@STRP41(T+1)
	@STRP42(T+1)
	@STRP43(T+1)
	@STRP44(T+1)
	@STRP45(T+1)
	@STRP46(T+1)
	@STRP47(T+1)

	@STRP48(T+1)
	@STRP49(T+1)
	@STRP50(T+1)
	@STRP51(T+1)
	@STRP52(T+1)
	@STRP53(T+1)
	@STRP54(T+1)
	@STRP55(T+1)

	[ASCIZ ⊗CMPA⊗]
	[ASCIZ ⊗CMP1⊗]
	[ASCIZ ⊗CMP2⊗]
	[ASCIZ ⊗CMP3⊗]
	[ASCIZ ⊗CMP4⊗]
	[ASCIZ ⊗CMP5⊗]
	[ASCIZ ⊗CMP6⊗]
	[ASCIZ ⊗CMPX⊗]

STRP05:	[ASCIZ ⊗NUM ⊗]
	[ASCIZ ⊗CHAR⊗]
	[ASCIZ ⊗HLT ⊗]

STRP06:	[ASCIZ ⊗SLA ⊗]
	[ASCIZ ⊗SRA ⊗]
	[ASCIZ ⊗SLAX⊗]
	[ASCIZ ⊗SRAX⊗]
	[ASCIZ ⊗SLC ⊗]
	[ASCIZ ⊗SRC ⊗]
	[ASCIZ ⊗SLB ⊗]
	[ASCIZ ⊗SRB ⊗]

STRP39:	[ASCIZ ⊗JMP ⊗]
	[ASCIZ ⊗JSJ ⊗]
	[ASCIZ ⊗JOV ⊗]
	[ASCIZ ⊗JNOV⊗]
	[ASCIZ ⊗JL  ⊗]
	[ASCIZ ⊗JE  ⊗]
	[ASCIZ ⊗JG  ⊗]
	[ASCIZ ⊗JGE ⊗]
	[ASCIZ ⊗JNE ⊗]
	[ASCIZ ⊗JLE ⊗]

STRP40:	[ASCIZ ⊗JAN ⊗]
	[ASCIZ ⊗JAZ ⊗]
	[ASCIZ ⊗JAP ⊗]
	[ASCIZ ⊗JANN⊗]
	[ASCIZ ⊗JANZ⊗]
	[ASCIZ ⊗JANP⊗]
	[ASCIZ ⊗JAE ⊗]
	[ASCIZ ⊗JAO ⊗]

STRP41:	[ASCIZ ⊗J1N ⊗]
	[ASCIZ ⊗J1Z ⊗]
	[ASCIZ ⊗J1P ⊗]
	[ASCIZ ⊗J1NN⊗]
	[ASCIZ ⊗J1NZ⊗]
	[ASCIZ ⊗J1NP⊗]
	[ASCIZ ⊗J1E ⊗]
	[ASCIZ ⊗J1O ⊗]

STRP42:	[ASCIZ ⊗J2N ⊗]
	[ASCIZ ⊗J2Z ⊗]
	[ASCIZ ⊗J2P ⊗]
	[ASCIZ ⊗J2NN⊗]
	[ASCIZ ⊗J2NZ⊗]
	[ASCIZ ⊗J2NP⊗]
	[ASCIZ ⊗J2E ⊗]
	[ASCIZ ⊗J2O ⊗]

STRP43:	[ASCIZ ⊗J3N ⊗]
	[ASCIZ ⊗J3Z ⊗]
	[ASCIZ ⊗J3P ⊗]
	[ASCIZ ⊗J3NN⊗]
	[ASCIZ ⊗J3NZ⊗]
	[ASCIZ ⊗J3NP⊗]
	[ASCIZ ⊗J3E ⊗]
	[ASCIZ ⊗J3O ⊗]

STRP44:	[ASCIZ ⊗J4N ⊗]
	[ASCIZ ⊗J4Z ⊗]
	[ASCIZ ⊗J4P ⊗]
	[ASCIZ ⊗J4NN⊗]
	[ASCIZ ⊗J4NZ⊗]
	[ASCIZ ⊗J4NP⊗]
	[ASCIZ ⊗J4E ⊗]
	[ASCIZ ⊗J4O ⊗]

STRP45:	[ASCIZ ⊗J5N ⊗]
	[ASCIZ ⊗J5Z ⊗]
	[ASCIZ ⊗J5P ⊗]
	[ASCIZ ⊗J5NN⊗]
	[ASCIZ ⊗J5NZ⊗]
	[ASCIZ ⊗J5NP⊗]
	[ASCIZ ⊗J5E ⊗]
	[ASCIZ ⊗J5O ⊗]

STRP46:	[ASCIZ ⊗J6N ⊗]
	[ASCIZ ⊗J6Z ⊗]
	[ASCIZ ⊗J6P ⊗]
	[ASCIZ ⊗J6NN⊗]
	[ASCIZ ⊗J6NZ⊗]
	[ASCIZ ⊗J6NP⊗]
	[ASCIZ ⊗J6E ⊗]
	[ASCIZ ⊗J6O ⊗]

STRP47:	[ASCIZ ⊗JXN ⊗]
	[ASCIZ ⊗JXZ ⊗]
	[ASCIZ ⊗JXP ⊗]
	[ASCIZ ⊗JXNN⊗]
	[ASCIZ ⊗JXNZ⊗]
	[ASCIZ ⊗JXNP⊗]
	[ASCIZ ⊗JXE ⊗]
	[ASCIZ ⊗JXO ⊗]

STRP48:	[ASCIZ ⊗INCA⊗]
	[ASCIZ ⊗DECA⊗]
	[ASCIZ ⊗ENTA⊗]
	[ASCIZ ⊗ENNA⊗]

STRP49:	[ASCIZ ⊗INC1⊗]
	[ASCIZ ⊗DEC1⊗]
	[ASCIZ ⊗ENT1⊗]
	[ASCIZ ⊗ENN1⊗]

STRP50:	[ASCIZ ⊗INC2⊗]
	[ASCIZ ⊗DEC2⊗]
	[ASCIZ ⊗ENT2⊗]
	[ASCIZ ⊗ENN2⊗]

STRP51:	[ASCIZ ⊗INC3⊗]
	[ASCIZ ⊗DEC3⊗]
	[ASCIZ ⊗ENT3⊗]
	[ASCIZ ⊗ENN3⊗]

STRP52:	[ASCIZ ⊗INC4⊗]
	[ASCIZ ⊗DEC4⊗]
	[ASCIZ ⊗ENT4⊗]
	[ASCIZ ⊗ENN4⊗]

STRP53:	[ASCIZ ⊗INC5⊗]
	[ASCIZ ⊗DEC5⊗]
	[ASCIZ ⊗ENT5⊗]
	[ASCIZ ⊗ENN5⊗]

STRP54:	[ASCIZ ⊗INC6⊗]
	[ASCIZ ⊗DEC6⊗]
	[ASCIZ ⊗ENT6⊗]
	[ASCIZ ⊗ENN6⊗]

STRP55:	[ASCIZ ⊗INCX⊗]
	[ASCIZ ⊗DECX⊗]
	[ASCIZ ⊗ENTX⊗]
	[ASCIZ ⊗ENNX⊗]

	SUBTTL	MIXERR

DEFINE	ZERROR	$(A,B)
{A:	OUTSTR	[ASCIZ	⊗
#ERROR: ⊗]
XLIST
	OUTSTR	B
	OUTCHR	["#"]
	SOS	LINENO
	EXCH	10, ERRORC
	AOBJN	10, .+1
	EXCH	10, ERRORC
	SOJ	PC,
	SKIPN	RUNC
	JRST	%$A
	PUTSTR	<[ASCIZ ⊗#ERROR: ⊗]>
	PUTSTR	<B>
	PUTSTR	<[ASCIZ ⊗#
⊗]>
	PUTSTR	<[ASCIZ ⊗ PC= ⊗]>
	MOVEI	13,4
	MOVEI	10,-MC0000(PC)
	PUTDEC
%$A:	MOVEI	10,-MC0000(PC)
	OUTSTR	[ASCIZ ⊗ PC= ⊗]
	PUSHJ	P,OUTD1
	JRST	BUTTON
LIST
}

DEFINE	WERROR	$(A,B)
{A:	OUTSTR	[ASCIZ	⊗
#ERROR: ⊗]
XLIST
	OUTSTR	B
	OUTCHR	["#"]
	SOS	LINENO
	EXCH	10, ERRORC
	AOBJN	10, .+1
	EXCH	10, ERRORC
	SOJ	PC,
	SKIPN	RUNC
	JRST	%$A
	PUTSTR	<[ASCIZ ⊗#ERROR: ⊗]>
	PUTSTR	<B>
	PUTSTR	<[ASCIZ ⊗#
⊗]>
	PUTSTR	<[ASCIZ ⊗ PC= ⊗]>
	MOVEI	13,4
	MOVEI	10,-MC0000(PC)
	PUTDEC
%$A:	MOVEI	10,-MC0000(PC)
	OUTSTR	[ASCIZ ⊗ PC= ⊗]
	PUSHJ	P,OUTD1
	OUTSTR	[ASCIZ ⊗
CORRECT CONDITION AND HIT CONTINUE BUTTON⊗]
	JRST	BUTTON
LIST
}

DEFINE	YERROR	$(A,B,C)
{A:	OUTSTR	[ASCIZ ⊗
#ERROR: ⊗]
XLIST
	OUTSTR	B
	OUTCHR	["#"]
	SOS	LINENO
	EXCH	10, ERRORC
	AOBJN	10, .+1
	EXCH	10, ERRORC
	SKIPN	RUNC
	JRST	%$A
	PUTSTR	<[ASCIZ ⊗#ERROR: ⊗]>
	PUTSTR	<B>
	PUTSTR	<[ASCIZ ⊗#
⊗]>
	PUTSTR	<[ASCIZ ⊗ PC= ⊗]>
	MOVEI	13,4
	MOVEI	10,-MC0000-1(PC)
	PUTDEC
%$A:	MOVEI	10,-MC0000-1(PC)
	OUTSTR	[ASCIZ ⊗ PC= ⊗]
	PUSHJ	P,OUTD1
	SKIPE	ERRHLT
	JRST	BUTTON
	C
	POPJ	P,
LIST
}

ERRHLT:	0		;NON ZERO DENOTES HALT ON NON-FATAL ERRORS
ERRORC:	0
LALL


ZERROR	(ZMOVER,<[ASCIZ  ⊗MEMORY OVERFLOW⊗]>)

YERROR	(YFIELD,<[ASCIZ  ⊗INVALID FIELD-BYTE: (0:5) USED⊗]>,<MOVEI 11, 5>)

YERROR	(Y2FIEL,<[ASCIZ  ⊗INVALID FIELD-BYTE: 00 USED⊗]>,<SETZM SAVEF>)

YERROR	(YINDEX,<[ASCIZ  ⊗INVALID INDEX-BYTE: 00 USED⊗]>,<SETZ 13,>)

YERROR	(YIREG,<[ASCIZ  ⊗BYTES 1-3 SHOULD BE ZERO FOR INDEX REGISTERS⊗]>,<JUMP>)

YERROR	(YMOVER,<[ASCIZ ⊗ILLEGAL EFFECTIVE ADDR: INSTR IGNORED⊗]>,<JRST NOP>)

ZERROR	(ZEOF,<[ASCIZ  ⊗END-OF-FILE ON INPUT⊗]>)

ZERROR	(ZINOUT,<[ASCIZ  ⊗SOME I/O ERROR⊗]>)

ZERROR	(ZDISK,<[ASCIZ  ⊗SOME DISK ERROR⊗]>)

WERROR	(ZIOBEG,<[ASCIZ  ⊗THIS DEVICE HASN'T BEEN INITIALIZED YET⊗]>)

ZERROR	(ZUNIT,<[ASCIZ  ⊗THIS UNIT CAN'T DO THIS I/O⊗]>)

ZERROR	(ZMLD,<[ASCIZ  ⊗ERROR IN .MLD INPUT⊗]>)

ZERROR	(ZIOC,<[ASCIZ ⊗ILLEGAL IOC⊗]>)

ZERROR	(ZRLOCK,<[ASCIZ ⊗TRYING TO LOAD BEFORE INPUT FINISHED⊗]>)

ZERROR	(ZWLOCK,<[ASCIZ ⊗TRYING TO STORE BEFORE OUTPUT FINISHED⊗]>)

ZERROR	(ZPCLOK,<[ASCIZ ⊗P.C. TRYING TO ACCESS BEFORE INPUT FINISHED⊗]>)

ZERROR	(ZDEV,<[ASCIZ ⊗ILLEGAL DEVICE FOR JBUS OR JRED⊗]>)
XALL
	SUBTTL	MIX999

COMMENT	⊗	These tables are used to convert ASCII-coded characters
		to MIX-coded characters and vice-versa.
		"!" is used to indicate a character which cannot be converted.
		"!" will be represented in MIX-code by 56.
	⊗

ASCMIX:
	REPEAT	40	{=56}

	=00	; <SPACE>
	=56
	=56
	=56
	=49	; $
	=56
	=56
	=55	; '

	=42	; (
	=43	; )
	=46	; *
	=44	; +
	=41	; ,
	=45	; -
	=40	; .
	=47	; /

	=30	; 0
	=31	; 1
	=32	; 2
	=33	; 3
	=34	; 4
	=35	; 5
	=36	; 6
	=37	; 7

	=38	; 8
	=39	; 9
	=54	; :
	=53	; ;
	=50	; <
	=48	; =
	=51	; >
	=56

	=52	; @
	=01	; A
	=02	; B
	=03	; C
	=04	; D
	=05	; E
	=06	; F
	=07	; G

	=08	; H
	=09	; I
	=11	; J
	=12	; K
	=13	; L
	=14	; M
	=15	; N
	=16	; O

	=17	; P
	=18	; Q
	=19	; R
	=22	; S
	=23	; T
	=24	; U
	=25	; V
	=26	; W

	=27	; X
	=28	; Y
	=29	; Z
	=56
	=56
	=56
	=56
	=56

	=56
	=01	; a
	=02	; b
	=03	; c
	=04	; d
	=05	; e
	=06	; f
	=07	; g

	=08	; h
	=09	; i
	=11	; j
	=12	; k
	=13	; l
	=14	; m
	=15	; n
	=16	; o

	=17	; p
	=18	; q
	=19	; r
	=22	; s
	=23	; t
	=24	; u
	=25	; v
	=26	; w

	=27	; x
	=28	; y
	=29	; z
	=56
	=56
	=56
	=56
	=56

MIXASC:
	" "
	"A"
	"B"
	"C"
	"D"
	"E"
	"F"
	"G"
	"H"
	"I"
	"!"
	"J"
	"K"
	"L"
	"M"
	"N"
	"O"
	"P"
	"Q"
	"R"
	"!"
	"!"
	"S"
	"T"
	"U"
	"V"
	"W"
	"X"
	"Y"
	"Z"

	"0"
	"1"
	"2"
	"3"
	"4"
	"5"
	"6"
	"7"
	"8"
	"9"

	"."
	","
	"("
	")"
	"+"
	"-"
	"*"
	"/"
	"="
	"$"

	"<"
	">"
	"@"
	";"
	":"
	"'"
	"!"
	"!"
	"!"
	"!"

	"!"
	"!"
	"!"
	"!"
INIT:	MOVE	P, [IOWD 40, PDL]
	PUSHJ	P,QNEWS		;TYPE OUT ANY MESSAGES
	MOVNI	10, 1
	GETLIN	10
	TLNN	10,420000	;IS IT A DISPLAY OF SOME SORT
	JRST	NOTDPY
	TLNE	10,400000
	JRST	ISIII		;IT'S A III
	DPYPOS	-150
	DPYSIZ	4000+4
	MOVEI	PC,MC0000
	PUSHJ	P,REWRIT	;WRITE DD SCREEN
	SETOM	DDSW#		;INDICATE DD
	JRST	NOTDPY
ISIII:	SETZM	DDSW
	DPYPOS	-250
	DPYSIZ	3000+4
	UPGIOT	DPYHED
NOTDPY:	setzb	0, 1
	setzb	2, 3
	setzb	4, 5
	setzb	6, 7
	setzb	10, 11
	setzb	12, 13
	setzb	14, 15
	MOVEI	PC,MC0000	;*RES* INITIALIZE PROGRAM COUNTER
	jrst	button
BEGIN NEWS

↑QNEWS:	MOVEM	4,ACSV+4	;SAVE REGISTERS 0-4
	MOVEI	4,ACSV
	BLT	4,ACSV+3
	INIT	6,10		;OPEN DISK IN IMAGE MODE
	SIXBIT	/DSK/
	NWSBF
	JRST	QN3		;NO SWEAT IF ERROR
	HLLZS	NWSLK+1		;CLEAR OUT RIGHT HALF OF EXT
	MOVE	0,[SIXBIT /MIXSYS/]
	MOVEM	0,NWSLK+3	;FIX UP PPN IN LOOKUP BLOCK
	LOOKUP	6,NWSLK		;LOOK FOR FILE
	JRST	QN4		;NO NEWS IS GOOD NEWS

;SEE IF HE REALLY WANTS TO READ THE NEWS

	LDB	1,[POINT 11,NWSLK+2,23]  ;GET TIME OF CREATION
	IDIVI	1,=60
	MOVE	0,DATE(1)		;GET HOUR
	MOVEM	0,MSTIME
	IDIVI	2,=10			;GET MINUTES
	ADDI	2,60
	ADDI	3,60
	DPB	2,[POINT 7,MSTIME+1,13]
	DPB	3,[POINT 7,MSTIME+1,20]
	LDB	1,[POINT 12,NWSLK+2,35]	;GET DATE OF CREATION
	IDIVI	1,=31
	MOVE	0,DATE+1(2)		;GET DAY OF WEEK
	MOVEM	0,MSDATE
	IDIVI	1,=12
	MOVE	0,MONTH(2)		;GET MONTH
	MOVEM	0,MSDATE+1
	MOVE	0,YEAR(1)		;GET YEAR
	MOVEM	0,MSDATE+2
	OUTSTR	MESSAG			;SEE IF HE WANTS THE NEWS
	INCHRW	0			;GET HIS ANSWER
	CAIN	0,"Y"			;IS IT Y
	JRST	READIT
	CAIE	0,"y"			;IS IT y
	JRST	QN4			;NO

READIT:	OUTSTR	[ASCIZ /
/]
	MOVE	0,[POINT 7,LINBUF]	;COLLECT A LINE AT A TIME
QN1:	PUSHJ	P,QIN		;GET A WORD
	TRNN	3,1		;IS IT A LINE NUMBER
	JRST	.+3		;NO
	PUSHJ	P,QIN		;GET ANOTHER ONE
	IBP	2		;MOVE PAST INITIAL TAB
QN1B:	ILDB	1,2		;GET A CHAR
	JUMPE	1,QN1		;GO BACK IF OUT OF CHARS
	IDPB	1,0		;WRITE IT OUT
	CAIE	1,12		;IS THAT THE LF AT THE END OF THE LINE
	JRST	QN1B		;NO
	MOVEI	1,0
	IDPB	1,0		;MAKE THE LINE AN ASCIZ STRING
	OUTSTR	LINBUF		;WRITE IT OUT
	MOVE	0,[POINT 7,LINBUF]
	JRST	QN1		;LOOK SOME MORE
QIN:	SOSG	NWSBF+2		;SEE IF ANY MORE CHARS THIS BUFFER
	IN	6,		;READ AGAIN
	JRST	.+4		;ALL OK
	STATZ	6,20000		;CHECK FOR EOF
	JRST	QN1A		;EOF
	JRST	QN5		;OTHER PROBLEMS
	ILDB	3,NWSBF+1	;PICK UP NEXT WORD
	JUMPE	3,QIN		;IGNORE NULL WORDS
	SETZ	4,		;ZERO OUT 4
	MOVE	2,[POINT 7,3]	; SO THAT 2 POINTS TO ASCIZ IN 3
	POPJ	P,
QN1A:	POP	P,(P)
QN2:	RELEAS	6,
	INSKIP			;JUST IS CASE HE SAID ↑0
	JFCL
	OUTSTR	[ASCIZ /
Type CR to start MIX/]
	INCHWL	1		;FIND LF
	CAIE	1,12
	JRST	.-2
QN3:	HRLZI	4,ACSV		;RESTORE REGS
	BLT	4,4
	POPJ	P,		;RETURN
QN4:	RELEAS	6,		;JUST RELEASE CHANNEL AND RETURN
	JRST	QN3
QN5:	POP	P,(P)
	OUTSTR	[ASCIZ /
DSK error in reading news/]
	JRST	QN2

NWSLK:	SIXBIT	/NEWS/
	SIXBIT	/MIX/
	0
	SIXBIT	/MIXSYS/
NWSBF:	BLOCK	3
ACSV:	BLOCK	5
LINBUF:	BLOCK	25
MESSAG:	ASCII	/Read the news as of /
MSTIME:	ASCII	/     /
	ASCII	/:00  /
MSDATE:	ASCII	/     /
	ASCII	/     /
	ASCII	/     /
	ASCIZ	/? /

BEND NEWS
	XLIST		;LITERALS FOLLOW
	LIT
	LIST	
	END	INIT